package com.cn.boot.spring.service.impl;
import com.cn.boot.spring.service.IUserService;
import com.cn.boot.spring.entity.UserEntity;
import com.cn.boot.spring.mapper.UserMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户逻辑实现层
 * @author Lxj
 * Created in 2021-01-27
 *
 */
@Service
@Transactional
//开启redsi缓存（user为缓存数据库中的文件夹名）
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserMapper userMapper;

    /**@Cacheable
     *将查询到的数据存入缓存中，以后的查询操作会优先从缓存中查询，
     *如果缓存中有数据，就直接将缓存中的数据提取出来，
     * 如果缓存中没有数据再去查询数据库（高效）
     *
     * @CachePut
     * 将查询到的数据存入缓存中，以后的查询操作都是直接差啊讯数据库然后
     * 将数据覆盖原来的缓存，不会优先查询缓存中的数据（低效）
     */

    @Cacheable(keyGenerator = "keyGenerator")
    @Override
    public List<UserEntity> findAll() {
        return userMapper.findAllUser();
    }

    @Cacheable(keyGenerator = "keyGenerator")
    @Override
    public List<UserEntity> findAllUser(UserEntity userEntity) {
//        return userMapper.findAllUser(userEntity);
        PageHelper.startPage(userEntity.getPageNum(),userEntity.getPageSize());
        Page<UserEntity> userEntityPage = userMapper.page();
        return userEntityPage;
    }

    /**
     * 通过id号查询的数据存入缓存中（键为user::id）
     */
    @Cacheable(key = "#id")
    @Override
    public UserEntity findById(Integer id) {
        return userMapper.findById(id);
    }

    /**
     * 添加用户没有涉及到查询操作，而@Cacheable是将返回结果存入缓存
     * 故直接用@CachePut就可以了
     * 添加新的用户后，用户列表更新，同时缓存中的数据也要更新(删除列表)
     * 故用组合缓存注解
     *     @CachePut(key="#result.id")//result等于UserEntity
     *     @CacheEvict(key = "'findAll[]'")//删除缓存中用户列表的key
     */
    @Caching(
        put = @CachePut(key="#result.id"),//result等于UserEntity
            evict = @CacheEvict(key = "'findAll[]'")//删除缓存中用户列表的key
    )
    @Override
    public UserEntity addUser(UserEntity userEntity) {
        //无论请求中是否有传递id号，将请求中的id置为null
        userEntity.setId(null);
        Integer integer = userMapper.addUser(userEntity);
        System.out.println(integer);
        return userEntity;
    }

    @Override
    public void addUsers(List<UserEntity> users) {
//        users.stream().forEach(userEntity -> userMapper.addUser(userEntity));
        //Lambda函数（λ）
        users.stream().forEach(userMapper::addUser);
    }

    @Override
    public void delUserByIds(List<Integer> ids) {
//        ids.stream().forEach(id->userMapper.delUserById(id));
        //Lambda函数（λ）
        ids.stream().forEach(userMapper::delUserById);
    }

    @Override
    public Page<UserEntity> page(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum,pageSize);
        Page<UserEntity> userEntityPage = userMapper.page();
        return userEntityPage;
    }



    @Override
    public Integer updateUser(UserEntity userEntity) {
        return userMapper.updateUser(userEntity);
    }

}
